Letting Go of Perfection

Holding myself accountable when no one else will

By

Perfectionism is a luxury which many of us just can't afford. This isn't some profound revelation, it's an unfortunate reality of the human condition. We are imperfect, and we don't operate within a vacuum. Even when obsessively checking and rechecking every single detail, flaws will still manage to creep their way into whatever the project happens to be.

I know it has become a meme at this point, but on top of being a software developer, I am also a woodworker and homesteader. I actually received a formal woodworking education at Red Rocks Community College in Lakewood, Colorado. The woodworking shop we had access to there was incredible, and for someone with perfectionist tendencies, it made it much easier to achieve something close to perfection. But the key phrase there is "close to."

There was always some flaw in everything I made. Some oversight from the design stage, or just some foolish mistake. There were so many variables when building something that it seemed impossible to be perfect. Wood itself is an imperfect medium, but human factors are unavoidable. I could not always be at the top of my game. I couldn't always eat the best food at the best time, or get the best sleep. Sometimes I would be under the weather and not able to take a day or two off because of project deadlines. I just had to accept my mistakes as part of the "charm" of my project, and hope to do better the next time.

This probably sounds very familiar to software development, except for there is one important, key difference: Software can technically be arbitrarily re-written on a whim. Now obviously, if you are working for a company, and the codebase is literally tens of thousands of lines of code long, then you aren't going to arbitrarily rewrite it. And that is certainly a valid, and probably useful, limitation of software development. But what about your personal project that has far less code and no deadline?

For myself, this is where the struggle comes in. When I work as a software developer for a company, perfection in my code certainly nags in the back of my mind, but it's not an option. I have deadlines to meet, and there are the other complexities which comes with rewriting working code. Tests need to be robust enough to catch potential new bugs, coworkers need to review it, and possible most importantly, the codebase will probably be imperfect again after the next big new feature is added anyway.

However, when doing my own personal projects, I'm faced with different dilemmas. The limitations are no longer imposed on me. I have the absolute say in what I do with my code. When building a guitar or a piece of furniture, fixing imperfections often means starting completely over, or redesigning the thing so it is technically no longer imperfect. Both of those approaches are risky for a number of reasons. With my software projects, I have to impose limits which force me to let go of perfection.

For instance, I'm currently building out a little web application using Angular, and every time I do anything, I have to see the bad design choices I made early on. I build on top of them, and it's painful. I could stop everything, and rewrite it all. Might take me a 1 or 2 days. That's not even a large setback, but I have to draw a line somewhere because there will always be something. The line I've drawn here is as such: if it's not causing problems now, then there is no need to mess with it. That's it! But my sneaky human brain does not want to accept this and looks for excuses to "fix" things. It's a constant tug-of-war between these perfectionist urges, and my pragmatist goals.

And I'm now finding that this is a recurring theme in my projects. I know perfection is never attainable, but near perfection is, and that is very tempting. I'm trying to find a balance between getting the thing actually done in a reasonable timeframe, and creating something that I'm personally happy with based on my own values. It's not easy.

To many people, this is all probably very obvious, but I think some of us struggle with being a perfectionist while in a setting that enables a strive for perfection. And sometimes, you do need to indulge this urge to see where it leads. There is certainly value in finding ways to improve upon existing implementations, and I do believe that will lead to being a better developer in the end. However, at least for me, there is great value in finishing and releasing my various app ideas, so I have to impose these restrictions upon myself to meet my goals.

I'm still figuring it out. I have to keep reminding myself that "perfection is the enemy of done," and that the flawed implementation I'm dwelling on can be updated in the future if/when the time comes. I have to think about my future projects that I want to actually get to someday, which will not happen if I'm tied to my current project, regardless of how great the code is. And I have to remind myself that no one cares about my code unless they actually have to work in it, and even then they probably wouldn't care all that much about it when all is said and done.

There is a lot more I could say about perfection that I won't get into now because this is already too long. I would only say that, striving for perfection is a double-edged sword. You can make something truly remarkable when driven to care about getting every little detail right, and that process will make you better at what you do, but it's also such a time sink that can only really be justified some of the time. So I guess if the goal is to get something done and published, set a deadline and question your decisions. Be accountable to yourself when there is no one else to hold you accountable. That won't be easy, but it will be necessary.

(print "Thanks for reading! 👋🏻")